package edu.pg.ipse.utils.io;

import java.io.*;
import java.util.Scanner;

public class ReadWithScanner {

	public static void main(String... aArgs) throws FileNotFoundException {
		ReadWithScanner parser = new ReadWithScanner(".\\data\\laplasfunction.txt");
		parser.processLineByLine();
		log("Done.");
	}

	/**
	 * @param aFileName
	 *            full name of an existing, readable file.
	 */
	public ReadWithScanner(String aFileName) {
		fFile = new File(aFileName);
	}

	/** Template method that calls {@link #processLine(String)}. */
	public final void processLineByLine() throws FileNotFoundException {
		Scanner scanner = new Scanner(fFile);
		try {
			while (scanner.hasNextLine()) {
				processLine(scanner.nextLine());
			}
		} finally {
			scanner.close();
		}
	}

	/**
	 * Overridable method for processing lines in different ways.
	 * 
	 * <P>
	 * This simple default implementation expects simple name-value pairs,
	 * separated by an '=' sign. Examples of valid input :
	 * <tt>height = 167cm</tt> <tt>mass =  65kg</tt>
	 * <tt>disposition =  "grumpy"</tt>
	 * <tt>this is the name = this is the value</tt>
	 */
	protected void processLine(String aLine) {
		// use a second Scanner to parse the content of each line
		Scanner scanner = new Scanner(aLine);
		scanner.useDelimiter("=");
		if (scanner.hasNext()) {
			String name = scanner.next();
			String value = scanner.next();
			log("Name is : " + quote(name.trim()) + ", and Value is : "
					+ quote(value.trim()));
		} else {
			log("Empty or invalid line. Unable to process.");
		}
		// (no need for finally here, since String is source)
		scanner.close();
	}

	private final File fFile;

	private static void log(Object aObject) {
		System.out.println(String.valueOf(aObject));
	}

	private String quote(String aText) {
		String QUOTE = "'";
		return QUOTE + aText + QUOTE;
	}
}
